#include <iostream>
#include <any>
#include <optional>

int add()
{
    return 10;
}

template<typename T>
std::optional<T> TypeCast(const std::any& a)
{
    try
    {
       T result = std::any_cast<T>(a);
       return result;
    }
    catch(const std::exception& e)
    {
        std::cerr << e.what() << '\n';
    }
    return std::nullopt;
};

int main()
{
    std::any a = 10;
    a = "hello";
    // a = 'c';
    // a = 3.14;
    // a = [](){};
    // a = add;
    // std::cout<<a.type().name()<<std::endl;

    //类型必须严格匹配
    // const char* s = std::any_cast<const char*>(a);
    // std::cout<<s<<std::endl;
    auto value = TypeCast<const char*>(a);
    
    return 0;
}